package com.study.d012Components.tableview;

import javafx.application.Application;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
import javafx.util.Callback;

/**Property数据类型--  基本table展示， 列设置使用Callback()回调方法
*@description
*@author xtayhame
*date 2020年3月14日
*version
*since v1.0
*/
public class TableViewMain3 extends Application{
	public static void main(String[] args) {
		launch(args);

	}
	@Override
	public void start(Stage stage) throws Exception {
		AnchorPane an = new AnchorPane();

		Button b1 =new Button("测试");

		TableView<Data2> tableView = new TableView<Data2>();


		an.getChildren().addAll(b1, tableView);
		AnchorPane.setTopAnchor(b1, 10.0);
		AnchorPane.setLeftAnchor(b1, 20.0);
		AnchorPane.setTopAnchor(tableView, 40.0);
		AnchorPane.setLeftAnchor(tableView, 20.0);


		stage.setScene(new Scene(an, 400, 500));
		stage.show();

		//如果要实现对tableview列表值的增删改监控操作，则需要在数据源中使用如下方法
		/*ObservableList<Data2> datas=FXCollections.observableArrayList(new Callback<Data2, Observable[]>() {
			@Override
			public Observable[] call(Data2 param) {
				// TODO Auto-generated method stub
				return null;
			}
		});*/

		ObservableList<Data2> datas=FXCollections.observableArrayList();
		Data2 d1 = new Data2("张三", 19, 55.9, true);
		Data2 d2 = new Data2("李四", 20, 75.9, true);
		Data2 d3 = new Data2("王五", 21, 85.9, false);
		Data2 d4 = new Data2("赵柳", 55, 95.9, true);

		datas.addAll(d1,d2,d3,d4);

		tableView.setItems(datas);

		TableColumn<Data2, String> tc_name=new TableColumn<Data2, String>("姓名");
		tc_name.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Data2,String>, ObservableValue<String>>() {
			@Override
			public ObservableValue<String> call(CellDataFeatures<Data2, String> param) {
				return param.getValue().getNameProperty();
			}
		});

		TableColumn<Data2, Number> tc_age=new TableColumn<Data2, Number>("年龄");
		tc_age.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Data2,Number>, ObservableValue<Number>>(
				) {
					@Override
					public ObservableValue<Number> call(CellDataFeatures<Data2, Number> param) {
						return param.getValue().getAgeProperty();
					}
		});

		//注意，这里要使用Number类型，因为只有ObservableValue<Number>这个泛型类
		TableColumn<Data2, Number> tc_score=new TableColumn<Data2, Number>("分数");
		tc_score.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Data2,Number>, ObservableValue<Number>>() {
			@Override
			public ObservableValue<Number> call(CellDataFeatures<Data2, Number> param) {
				return param.getValue().getScoreProperty();
			}
		});

		TableColumn<Data2, Boolean> tc_is=new TableColumn<Data2, Boolean>("是否选中");
		tc_is.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Data2,Boolean>, ObservableValue<Boolean>>() {

			@Override
			public ObservableValue<Boolean> call(CellDataFeatures<Data2, Boolean> param) {
				return param.getValue().getIsProperty();
			}
		});

		tableView.getColumns().add(tc_name);
		tableView.getColumns().add(tc_age);
		tableView.getColumns().add(tc_score);
		tableView.getColumns().add(tc_is);


		//注意：如果要想监控是否更新，则需要在
		tableView.getItems().addListener(new ListChangeListener<Data2>() {
			@Override
			public void onChanged(javafx.collections.ListChangeListener.Change<? extends Data2> c) {
				if(c.next()){
					System.out.println("是否更新："+c.wasUpdated());
				}
			}
		});

		b1.setOnAction(new EventHandler<ActionEvent>() {

			@Override
			public void handle(ActionEvent event) {



				//删除
				//tableView.getItems().remove(0);

				//注意：这里使用的Data2类中的属性是Property类型，tableview已帮忙实现更新操作，所以无需再调用refresh()
				d1.setName("李逵");

				//新增
				//tableView.getItems().add(new Data2("A", 19, 55.9, true));

			}
		});

	}
}
